﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;

using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace ZJUDTS
{
	/// <summary>
	/// 表示带有图像的项目。
	/// </summary>
	/// <remarks>该类型用于为按钮、菜单项等控件提供良好的可视化外观。</remarks>
	public class ImageItem : INotifyPropertyChanged
	{
		/// <summary>
		/// 项目的图像。
		/// </summary>
		private ImageSource image;

		/// <summary>
		/// 获取或设置项目的图像。
		/// </summary>
		public ImageSource Image
		{
			get
			{
				return image;
			}
			set
			{
				image = value;
				this.OnPropertyChanged("Image");
			}
		}

		/// <summary>
		/// 项目的名称。
		/// </summary>
		private string text;

		/// <summary>
		/// 获取或设置项目的名称。
		/// </summary>
		public string Text
		{
			get
			{
				return text;
			}
			set
			{
				text = value;
				this.OnPropertyChanged("Text");
			}
		}

		/// <summary>
		/// 项目的描述。
		/// </summary>
		private string description;

		/// <summary>
		/// 获取或设置项目的描述。
		/// </summary>
		public string Description
		{
			get
			{
				return description;
			}
			set
			{
				description = value;
				this.OnPropertyChanged("Description");
			}
		}

		/// <summary>
		/// 项目对应的命令。
		/// </summary>
		private ICommand command;

		/// <summary>
		/// 获取或设置项目对应的命令。
		/// </summary>
		public ICommand Command
		{
			get
			{
				return command;
			}
			set
			{
				command = value;
				this.OnPropertyChanged("Command");
			}
		}

		/// <summary>
		/// 初始化一个新的项目。
		/// </summary>
		public ImageItem()
		{
		}
		
		#region INotifyPropertyChanged 成员

		/// <summary>
		/// 当属性值发生更改时引发。
		/// </summary>
		public event PropertyChangedEventHandler PropertyChanged;

		/// <summary>
		/// 引发 PropertyChanged 事件。
		/// </summary>
		/// <param name="propertyName">发生更改的属性名称。</param>
		protected void OnPropertyChanged(string propertyName)
		{
			if (propertyName == null)
			{
				throw new ArgumentNullException("propertyName");
			}

			if (this.PropertyChanged != null)
			{
				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
			}
		}

		#endregion
	}

	/// <summary>
	/// 表示图像项目的集合。
	/// </summary>
	public class ImageItemCollection : ObservableCollection<ImageItem>
	{
		/// <summary>
		/// 初始化一个集合的新实例。
		/// </summary>
		public ImageItemCollection()
		{
		}
	}
}
